import 'package:flutter/material.dart';
import 'package:sp_util/sp_util.dart';

/// 全局配置类
/// 管理应用的全局状态、用户信息、主题设置等
class GlobalConfig {
  static final GlobalConfig _instance = GlobalConfig._internal();
  factory GlobalConfig() => _instance;
  GlobalConfig._internal();
  
  // ========== 用户信息相关 ========== //
  
  /// 当前登录用户ID
  String? _currentUserId;
  String? get currentUserId => _currentUserId;
  
  /// 当前登录用户信息
  Map<String, dynamic>? _currentUserInfo;
  Map<String, dynamic>? get currentUserInfo => _currentUserInfo;
  
  /// 是否已登录
  bool get isLoggedIn => _currentUserId != null && _currentUserId!.isNotEmpty;
  
  /// 设置当前用户信息
  /// [userId] 用户ID
  /// [userInfo] 用户信息
  void setCurrentUser(String userId, Map<String, dynamic> userInfo) {
    _currentUserId = userId;
    _currentUserInfo = userInfo;
    
    // 保存到本地存储
    SpUtil.putString('current_user_id', userId);
    SpUtil.putObject('current_user_info', userInfo);
  }
  
  /// 清除当前用户信息
  void clearCurrentUser() {
    _currentUserId = null;
    _currentUserInfo = null;
    
    // 清除本地存储
    SpUtil.remove('current_user_id');
    SpUtil.remove('current_user_info');
  }
  
  /// 从本地存储加载用户信息
  void loadUserFromLocal() {
    _currentUserId = SpUtil.getString('current_user_id');
    _currentUserInfo = SpUtil.getObj('current_user_info', (v) => (v as Map<String, dynamic>?) ?? <String, dynamic>{});
  }
  
  // ========== 应用设置相关 ========== //
  
  /// 主题模式
  ThemeMode _themeMode = ThemeMode.system;
  ThemeMode get themeMode => _themeMode;
  
  /// 设置主题模式
  /// [mode] 主题模式
  void setThemeMode(ThemeMode mode) {
    _themeMode = mode;
    SpUtil.putInt('theme_mode', mode.index);
  }
  
  /// 从本地存储加载主题设置
  void loadThemeFromLocal() {
    int? themeIndex = SpUtil.getInt('theme_mode');
    if (themeIndex != null) {
      _themeMode = ThemeMode.values[themeIndex];
    }
  }
  
  /// 语言设置
  Locale? _locale;
  Locale? get locale => _locale;
  
  /// 设置语言
  /// [locale] 语言设置
  void setLocale(Locale locale) {
    _locale = locale;
    SpUtil.putString('locale', locale.languageCode);
  }
  
  /// 从本地存储加载语言设置
  void loadLocaleFromLocal() {
    String? languageCode = SpUtil.getString('locale');
    if (languageCode != null) {
      _locale = Locale(languageCode);
    }
  }
  
  // ========== 业务数据相关 ========== //
  
  /// 客服电话
  String customerServicePhone = '400-123-4567';
  
  /// 测试图片地址
  String testImageUrl = 'https://picsum.photos/300/200';
  
  /// 默认头像地址
  String defaultAvatarUrl = 'https://picsum.photos/100/100';
  
  /// 测试视频地址
  String testVideoUrl = 'https://sample-videos.com/zip/10/mp4/SampleVideo_1280x720_1mb.mp4';
  
  /// 主题色
  Color primaryColor = const Color(0xFF2196F3);
  
  /// 通用间隔
  double commonPadding = 16.0;
  
  /// 药材类型列表
  List<String> medicineTypes = [
    '中药材',
    '中成药',
    '西药',
    '保健品',
    '医疗器械',
    '其他',
  ];
  
  /// 供应商列表
  List<Map<String, dynamic>> supplierList = [
    {
      'id': '1',
      'name': '北京同仁堂',
      'address': '北京市东城区',
      'phone': '010-12345678',
    },
    {
      'id': '2',
      'name': '广州医药集团',
      'address': '广州市天河区',
      'phone': '020-87654321',
    },
    {
      'id': '3',
      'name': '上海医药股份',
      'address': '上海市浦东新区',
      'phone': '021-11223344',
    },
  ];
  
  /// 订单状态映射
  Map<int, String> orderStatusMap = {
    0: '待支付',
    1: '已支付',
    2: '配送中',
    3: '已完成',
    4: '已取消',
  };
  
  /// 用户审核状态映射
  Map<int, String> userAuditStatusMap = {
    0: '待审核',
    1: '审核通过',
    2: '审核拒绝',
  };
  
  /// 诊所审核状态映射
  Map<int, String> clinicAuditStatusMap = {
    0: '待审核',
    1: '审核通过',
    2: '审核拒绝',
  };
  
  // ========== 初始化方法 ========== //
  
  /// 初始化全局配置
  Future<void> init() async {
    // 确保 SpUtil 已初始化
    await SpUtil.getInstance();
    
    // 加载本地存储的配置
    loadUserFromLocal();
    loadThemeFromLocal();
    loadLocaleFromLocal();
  }
  
  /// 重置所有配置
  void reset() {
    clearCurrentUser();
    _themeMode = ThemeMode.system;
    _locale = null;
    
    // 清除本地存储
    SpUtil.clear();
  }
  
  // ========== 工具方法 ========== //
  
  /// 获取订单状态文本
  /// [status] 订单状态码
  String getOrderStatusText(int status) {
    return orderStatusMap[status] ?? '未知状态';
  }
  
  /// 获取用户审核状态文本
  /// [status] 审核状态码
  String getUserAuditStatusText(int status) {
    return userAuditStatusMap[status] ?? '未知状态';
  }
  
  /// 获取诊所审核状态文本
  /// [status] 审核状态码
  String getClinicAuditStatusText(int status) {
    return clinicAuditStatusMap[status] ?? '未知状态';
  }
  
  /// 检查是否需要登录
  /// 如果未登录，返回 true
  bool checkNeedLogin() {
    // 检查新的登录状态存储方式
    bool isLoggedInNew = SpUtil.getBool('is_logged_in', defValue: false) ?? false;
    return !isLoggedInNew && !isLoggedIn;
  }
  
  /// 设置布尔值到本地存储
  /// [key] 键名
  /// [value] 值
  Future<bool> setBool(String key, bool value) async {
    return await SpUtil.putBool(key, value) ?? false;
  }
  
  /// 从本地存储获取布尔值
  /// [key] 键名
  /// [defaultValue] 默认值
  bool getBool(String key, {bool defaultValue = false}) {
    return SpUtil.getBool(key, defValue: defaultValue) ?? defaultValue;
  }
  
  /// 设置字符串到本地存储
  /// [key] 键名
  /// [value] 值
  Future<bool> setString(String key, String value) async {
    return await SpUtil.putString(key, value) ?? false;
  }
  
  /// 从本地存储获取字符串
  /// [key] 键名
  String? getString(String key) {
    return SpUtil.getString(key);
  }
  
  /// 从本地存储移除指定键
  /// [key] 键名
  Future<bool> remove(String key) async {
    return await SpUtil.remove(key) ?? false;
  }
  
  /// 格式化价格显示
  /// [price] 价格
  String formatPrice(double price) {
    return '¥${price.toStringAsFixed(2)}';
  }
  
  /// 格式化手机号显示
  /// [phone] 手机号
  String formatPhone(String phone) {
    if (phone.length == 11) {
      return '${phone.substring(0, 3)}****${phone.substring(7)}';
    }
    return phone;
  }
  
  /// 格式化手机号显示（别名方法）
  /// [phone] 手机号
  String formatPhoneNumber(String phone) {
    return formatPhone(phone);
  }
}

/// 全局配置实例
final globalConfig = GlobalConfig();